#include "comment.h"

char currentLoginUserName[128] = {0};

// 工作线程，接受服务器返回来的消息
void *work(void *pArg)
{
     // 把套接字从地址里面取出来
     int sID = *(int *)pArg;
     // 用户连接后会创建当前线程，并且会把用户的套接字id通过参数传入进来
     // 这里是把套接字从地址里面取出来
     MSG msg;
     // struct sockaddr_in clientAddr;
     // socklen_t len = sizeof(clientAddr);
     int ret = 0;
     // 接收消息
     while (0 < (ret = recv(sID, &msg, sizeof(MSG), 0)))
     {
          SINGLE_CHAT *pSC = (SINGLE_CHAT *)msg.buf;
          if (0 == strcmp(pSC->text, "quit"))
          {
               break;
          }

          printf("游戏编号：%d\n", pSC->game_id);
          printf("接受到%s发来的消息：%s\n", pSC->selfName, pSC->text);
     }
     if (ret <= 0)
     {
          printf("接受数据出错了，服务器可能被关掉了\n");
     }
}

void userSingleChat_c(int sID) // 单聊函数
{
     pthread_t pt;
     MSG msg;
     // 启动一个接受消息的线程
     SINGLE_CHAT sc;
     strcpy(sc.selfName, currentLoginUserName); // 自己的名字
     printf("请输入游戏id\n");
     scanf("%d", &sc.game_id); // 游戏id
     msg.type = 100000;        // 先把消息类型清空

     printf("请输入对方的名字\n");
     scanf("%s", sc.destName); // 对方的名字

     pthread_create(&pt, NULL, work, &sID);

     while (1)
     {
          printf("请输入聊天的内容\n");
          scanf("%s", sc.text);

          msg.type = singleChat; // 消息类型为单聊
          // 把单聊的内容拷贝到消息的仓库中
          memcpy(msg.buf, &sc, sizeof(sc));

          // 把消息发送给服务器
          int ret = send(sID, &msg, sizeof(msg), 0);
          if (ret == -1)
          {
               printf("发送数据出错了\n");
               break;
          }

          if (strcmp(sc.text, "quit") == 0)
          {
               msg.type = chat_quit; // 消息类型为退出聊天
               ret = send(sID, &msg, sizeof(msg), 0);
               if (ret == -1)
               {
                    printf("发送数据出错了\n");
                    pthread_cancel(pt);
                    break;
               }
               pthread_cancel(pt);
               break;
          }
     }
}

void userSingleChat(int sID, GAME_AC pSC) // 咨询单聊函数
{
     pthread_t pt;
     MSG msg;

     SINGLE_CHAT sc;
     strcpy(sc.selfName, currentLoginUserName); // 自己的名字
     strcpy(sc.destName, pSC.name);             // 对方的名字
     sc.game_id = pSC.id;                       // 游戏id
     // 启动一个接受消息的线程
     pthread_create(&pt, NULL, work, &sID);

     while (1)
     {
          printf("请输入聊天的内容\n");
          scanf("%s", sc.text);

          msg.type = singleChat; // 消息类型为单聊
          // 把单聊的内容拷贝到消息的仓库中
          memcpy(msg.buf, &sc, sizeof(sc));

          // 把消息发送给服务器
          int ret = send(sID, &msg, sizeof(msg), 0);
          if (ret == -1)
          {
               printf("发送数据出错了\n");
               break;
          }

          if (strcmp(sc.text, "quit") == 0)
          {
               msg.type = chat_quit; // 消息类型为退出聊天
               ret = send(sID, &msg, sizeof(msg), 0);
               if (ret == -1)
               {
                    printf("发送数据出错了\n");
                    pthread_cancel(pt);
                    break;
               }
               pthread_cancel(pt);
               break;
          }
     }
}

void leave_massage(int sID, GAME_AC pSC) // 留言函数
{
     MSG msg;
     LEAVE sc;
     strcpy(sc.name, currentLoginUserName); // 自己的名字
     sc.g_id = pSC.id;                      // 游戏id

     printf("请输入留言的内容\n");
     scanf("%s", sc.items);

     msg.type = leave; // 消息类型为留言
     // 把单聊的内容拷贝到消息的仓库中
     memcpy(msg.buf, &sc, sizeof(sc));

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
     }
     recv(sID, &msg, sizeof(msg), 0);
     if (msg.type == ok) // 留言完成
     {
          printf("留言完成\n");
     }
}

void usergoumai(int sID, GAME_AC pSC) // 购买
{
     GOUMAI_CHAT ct;
     MSG msg;
     msg.type = user_goumai;                    // 消息类型为购买
     ct.game_id = pSC.id;                       // 游戏id
     strcpy(ct.selfName, currentLoginUserName); // 自己的名字
     strcpy(ct.destName, pSC.name);             // 对方的名字
     ct.price = pSC.price;                      // 价格
     memcpy(msg.buf, &ct, sizeof(GOUMAI_CHAT));

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }

     msg.type = 100000; // 先把消息类型清空
     ret = 0;
     // 接受服务器返回的聊天记录，如果消息类型为queryOver，说明接受完毕
     recv(sID, &msg, sizeof(msg), 0);

     if (msg.type == user_goumaiover) // 查询结束
     {
          printf("购买成功！\n");
     }

     return;
}

void game_goumai(int sID) // 交流与购买
{
     printf("请输入你想要的账号id：");
     GAME_AC ac;
     scanf("%d", &ac.id);

     MSG msg;
     msg.type = chat_goumai;
     memcpy(msg.buf, &ac, sizeof(ac));

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }

     msg.type = 100000; // 先把消息类型清空
     ret = 0;
     GAME_AC *pSC;
     LEAVE *lSC;
     GAME_AC pSC_1;
     int sum = 0;
     int sum__1;
     // 接受服务器返回的聊天记录，如果消息类型为queryOver，说明接受完毕
     while (0 < (ret = recv(sID, &msg, sizeof(msg), 0)))
     {
          if (msg.type == queryOver) // 查询结束
          {
               break;
          }
          else if (msg.type == queryChatRec) // 有信息
          {
               pSC = (GAME_AC *)msg.buf;
               pSC_1 = *pSC;
               printf("---------------------------------------------------------\n");
               printf("| ID : %d\t| NAME : %s\t| 游戏名 : %s\n", pSC->id, pSC->name, pSC->game_name);
               printf("---------------------------------------------------------\n");
               printf("游戏内容 : %s\n", pSC->items);
               printf("---------------------------------------------------------\n");
               if (pSC->status == 1)
               {
                    sum__1 = pSC->status;
                    printf("| 在发售\t|");
               }
               else
               {
                    printf("| 已下架\t|");
               }
               printf(" 发售时间 : %.10s\t| 价格 : %d\n", pSC->time, pSC->price);
               printf("---------------------------------------------------------\n\n\n");
          }
          else if (msg.type == queryChatRec_leave) // 有留言
          {
               lSC = (LEAVE *)msg.buf;
               printf("---------------------------------------------------------\n");
               printf("|%d. %s : %s\n", ++sum, lSC->name, lSC->items);
               printf("---------------------------------------------------------\n");
          }
          else if (msg.type == mistake) // 没有此账号
          {
               printf("该账号不存在\n");
               return;
          }
     }
     if (sum__1 == 1)
     {
          while (1)
          {
               printf("1.购买 2.咨询 3.留言 4.退出\n");
               int aa;
               while (1)
               {
                    scanf("%d", &aa);
                    if (aa == 1 || aa == 2 || aa == 3 || aa == 4)
                    {
                         break;
                    }
                    else
                    {
                         printf("输入有误，请重新输入：\n");
                         while (getchar() != '\n')
                              ;
                         continue;
                    }
               }
               if (aa == 1)
               {
                    usergoumai(sID, pSC_1); // 购买
                    break;
               }
               else if (aa == 2)
               {
                    userSingleChat(sID, pSC_1); // 单聊
               }
               else if (aa == 3)
               {
                    leave_massage(sID, pSC_1); // 留言
               }
               else if (aa == 4)
               {
                    break; // 退出
               }
          }
     }
     else
     {
          printf("该账号已下架\n");
     }
}

void game_chazhang_1(int sID) // 按照游戏名称筛选
{
     MSG msg;
     printf("请输入游戏的名称\n");
     scanf("%s", msg.buf);
     msg.type = showgamezhanghao_gamename; // 消息类型为查看账号

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }

     printf("查询到一下结果\n");

     msg.type = 100000; // 先把消息类型清空
     ret = 0;
     // 接受服务器返回的聊天记录，如果消息类型为queryOver，说明接受完毕
     while (0 < (ret = recv(sID, &msg, sizeof(msg), 0)))
     {
          if (msg.type == queryOver) // 查询结束
          {
               break;
          }
          else if (msg.type == queryChatRec) // 有信息
          {
               GAME_AC *pSC = (GAME_AC *)msg.buf;
               printf("---------------------------------------------------------\n");
               printf("| ID : %d\t| NAME : %s\t| 游戏名 : %s\n", pSC->id, pSC->name, pSC->game_name);
               printf("---------------------------------------------------------\n");
               printf("游戏内容 : %s\n", pSC->items);
               printf("---------------------------------------------------------\n");
               if (pSC->status == 1)
               {
                    printf("| 在发售\t|");
               }
               else
               {
                    printf("| 已下架\t|");
               }
               printf(" 发售时间 : %.10s\t| 价格 : %d\n", pSC->time, pSC->price);
               printf("---------------------------------------------------------\n\n\n");
          }
     }

     return;
}

void game_chazhang_2(int sID) // 按照用户名筛选
{
     MSG msg;
     printf("请输入用户的名称\n");
     scanf("%s", msg.buf);
     msg.type = showgamezhanghao_name; // 消息类型为查看账号

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }

     printf("查询到一下结果\n");

     msg.type = 100000; // 先把消息类型清空
     ret = 0;
     // 接受服务器返回的聊天记录，如果消息类型为queryOver，说明接受完毕
     while (0 < (ret = recv(sID, &msg, sizeof(msg), 0)))
     {
          if (msg.type == queryOver) // 查询结束
          {
               break;
          }
          else if (msg.type == queryChatRec) // 有信息
          {
               GAME_AC *pSC = (GAME_AC *)msg.buf;
               printf("---------------------------------------------------------\n");
               printf("| ID : %d\t| NAME : %s\t| 游戏名 : %s\n", pSC->id, pSC->name, pSC->game_name);
               printf("---------------------------------------------------------\n");
               printf("游戏内容 : %s\n", pSC->items);
               printf("---------------------------------------------------------\n");
               if (pSC->status == 1)
               {
                    printf("| 在发售\t|");
               }
               else
               {
                    printf("| 已下架\t|");
               }
               printf(" 发售时间 : %.10s\t| 价格 : %d\n", pSC->time, pSC->price);
               printf("---------------------------------------------------------\n\n\n");
          }
     }

     return;
}

void game_chazhang_3(int sID) // 查看所有账号
{
     MSG msg;
     msg.type = showgamezhanghao_all; // 消息类型为查看账号

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }

     printf("查询到一下结果\n");

     msg.type = 100000; // 先把消息类型清空
     ret = 0;
     // 接受服务器返回的聊天记录，如果消息类型为queryOver，说明接受完毕
     while (0 < (ret = recv(sID, &msg, sizeof(msg), 0)))
     {
          if (msg.type == queryOver) // 查询结束
          {
               break;
          }
          else if (msg.type == queryChatRec) // 有信息
          {
               GAME_AC *pSC = (GAME_AC *)msg.buf;
               printf("---------------------------------------------------------\n");
               printf("| ID : %d\t| NAME : %s\t| 游戏名 : %s\n", pSC->id, pSC->name, pSC->game_name);
               printf("---------------------------------------------------------\n");
               printf("游戏内容 : %s\n", pSC->items);
               printf("---------------------------------------------------------\n");
               if (pSC->status == 1)
               {
                    printf("| 在发售\t|");
               }
               else
               {
                    printf("| 已下架\t|");
               }
               printf(" 发售时间 : %.10s\t| 价格 : %d\n", pSC->time, pSC->price);
               printf("---------------------------------------------------------\n\n\n");
          }
     }

     return;
}

void game_chazhang(int sID) // 查询账号
{
     printf("请选择你的筛选条件\n");
     printf("1.游戏名称\t2.用户名\t3.所有账号\n");
     int a = 0;
     while (1)
     {
          scanf("%d", &a);
          if (a == 1 || a == 2 || a == 3)
          {
               break;
          }
          else
          {
               printf("输入有误，请重新输入：\n");
               while (getchar() != '\n')
                    ;
               continue;
          }
     }
     switch (a)
     {
     case 1:
          game_chazhang_1(sID);
          break;
     case 2:
          game_chazhang_2(sID);
          break;
     case 3:
          game_chazhang_3(sID);
          break;
     default:
          break;
     }
}

void examinefunc(int sID) // 查看新消息有多好行
{
     MSG msg;
     msg.type = examine;
     strcpy(msg.buf, currentLoginUserName);
     int counts = 0;

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }

     recv(sID, &msg, sizeof(msg), 0);
     int *a = (int *)msg.buf;
     if (*a > 0)
     {
          printf("你有%d条新消息，点击 3 可查看消息\n", *a);
     }
}

void examinefunc_look(int sID) // 查看新消息
{
     MSG msg;
     msg.type = examinelook;
     strcpy(msg.buf, currentLoginUserName);

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }

     while (0 < (ret = recv(sID, &msg, sizeof(msg), 0)))
     {
          if (msg.type == queryOver) // 查询结束
          {
               printf("查询结束\n");
               break;
          }
          else if (msg.type == queryChatRec) // 有信息
          {
               SINGLE_CHAT *pSC = (SINGLE_CHAT *)msg.buf;
               printf("\t\t%s\n", pSC->time);
               printf("---------------------------------------------------------\n");
               printf("|\t\t关联游戏ID：%d\t发送者：%s\n", pSC->game_id, pSC->destName);
               printf("---------------------------------------------------------\n");
               printf("消息内容 : %s\n", pSC->text);
               printf("---------------------------------------------------------\n\n\n");
          }
          else if (msg.type == no_news)
          {
               printf("没有新消息\n");
               return;
          }
     }
}

void examinelook_all(int sID) // 查看聊天记录
{
     MSG msg;
     msg.type = examinelookall;
     SINGLE_CHAT sc;
     strcpy(sc.selfName, currentLoginUserName);
     printf("请输入对方的名字\n");
     scanf("%s", sc.destName);
     printf("请输入关联游戏id\n");
     scanf("%d", &sc.game_id);
     memcpy(msg.buf, &sc, sizeof(SINGLE_CHAT));

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }

     while (0 < (ret = recv(sID, &msg, sizeof(msg), 0)))
     {
          if (msg.type == queryOver) // 查询结束
          {
               printf("查询结束\n");
               break;
          }
          else if (msg.type == queryChatRec) // 有信息
          {
               SINGLE_CHAT *pSC = (SINGLE_CHAT *)msg.buf;
               printf("\t\t%s\n", pSC->time);
               printf("---------------------------------------------------------\n");
               printf("%s: %s\n", pSC->destName, pSC->text);
               printf("---------------------------------------------------------\n");
          }
          else if (msg.type == no_news)
          {
               printf("没有新消息\n");
               return;
          }
     }
}

void order_func(int sID) // 订单函数
{
     MSG msg;
     msg.type = order;
     strcpy(msg.buf, currentLoginUserName);

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }

     while (0 < (ret = recv(sID, &msg, sizeof(msg), 0)))
     {
          if (msg.type == queryOver) // 查询结束
          {
               printf("查询结束\n");
               break;
          }
          else if (msg.type == queryChatRec) // 有信息
          {
               GOUMAI_CHAT *pSC = (GOUMAI_CHAT *)msg.buf;
               printf("---------------------------------------------------------\n");
               printf("|1.订单生成时间：%s\n", pSC->time);
               printf("|2.关联游戏ID：%d\n", pSC->game_id);
               printf("|3.购买者：%s\n", pSC->selfName);
               printf("|4.售卖者：%s\n", pSC->destName);
               printf("|5.价格：%d\n", pSC->price);
               printf("---------------------------------------------------------\n\n\n");
          }
          else if (msg.type == no_news)
          {
               printf("没有订单\n");
               return;
          }
     }
}

void quit_all(int sID) // 退出账号函数
{
     MSG msg;
     msg.type = quitall;
     strcpy(msg.buf, currentLoginUserName);

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }
}

int registerUser(int sID) // 注册函数
{
     RGU rgu;
     printf("请输入用户名\n");
     scanf("%s", rgu.name);
     printf("请输入密码\n");
     scanf("%s", rgu.pwd);
     printf("请输入电话号码\n");
     scanf("%s", rgu.phone);
     printf("请输入年月日，格式YYYY-MM-DD\n");
     scanf("%s", rgu.date);

     MSG msg;
     msg.type = regist;
     memcpy(msg.buf, &rgu, sizeof(rgu)); // 把注册结构体拷贝到消息结构体的仓库中

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return -1;
     }
     ret = recv(sID, &msg, sizeof(msg), 0);
     printf("%s\n", msg.buf);
     return 1;
}

void shell_func(int sID) // 上架商品
{
     GAME_AC as;
     strcpy(as.name, currentLoginUserName);
     printf("请输入游戏名字\n");
     scanf("%s", as.game_name);
     printf("游戏内容\n");
     scanf("%s", as.items);
     printf("你的发售价格\n");
     scanf("%d", &as.price);

     MSG msg;
     msg.type = shell;
     memcpy(msg.buf, &as, sizeof(GAME_AC)); // 把注册结构体拷贝到消息结构体的仓库中

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }
     recv(sID, &msg, sizeof(msg), 0);
     printf("%s\n", msg.buf);
}

void my_account_func(int sID) // 查看自己的账号
{
     MSG msg;
     msg.type = showgamezhanghao_name;
     strcpy(msg.buf, currentLoginUserName);

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }
     printf("查询到以下你的游戏账号\n");

     msg.type = 100000; // 先把消息类型清空
     ret = 0;
     // 接受服务器返回的聊天记录，如果消息类型为queryOver，说明接受完毕
     while (0 < (ret = recv(sID, &msg, sizeof(msg), 0)))
     {
          if (msg.type == queryOver) // 查询结束
          {
               break;
          }
          else if (msg.type == queryChatRec) // 有信息
          {
               GAME_AC *pSC = (GAME_AC *)msg.buf;
               printf("---------------------------------------------------------\n");
               printf("| ID : %d\t| NAME : %s\t| 游戏名 : %s\n", pSC->id, pSC->name, pSC->game_name);
               printf("---------------------------------------------------------\n");
               printf("游戏内容 : %s\n", pSC->items);
               printf("---------------------------------------------------------\n");
               if (pSC->status == 1)
               {
                    printf("| 在发售\t|");
               }
               else
               {
                    printf("| 已下架\t|");
               }
               printf(" 发售时间 : %.10s\t| 价格 : %d\n", pSC->time, pSC->price);
               printf("---------------------------------------------------------\n\n\n");
          }
     }

     msg.type = my_account;
     strcpy(msg.buf, currentLoginUserName);
     // 把消息发送给服务器
     ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return;
     }
     printf("你的账号信息\n");

     // 接受服务器返回的聊天记录，如果消息类型为queryOver，说明接受完毕
     while (0 < (ret = recv(sID, &msg, sizeof(msg), 0)))
     {
          if (msg.type == queryOver) // 查询结束
          {
               break;
          }
          else if (msg.type == queryChatRec) // 有信息
          {
               RGU *pSC = (RGU *)msg.buf;
               printf("---------------------------------------------------------\n");
               printf("| 用户名 : %s\t| phone : %s\t| 生日 : %s\n", pSC->name, pSC->phone, pSC->date);
               printf("---------------------------------------------------------\n");
               printf("钱包余额 : %d\n", pSC->wallet);
               printf("---------------------------------------------------------\n");
          }
     }
}

int userLogin(int sID) // 登录函数
{
     RGU rgu; // 登录可以重用注册的结构体
     printf("请输入用户名\n");
     scanf("%s", rgu.name);
     printf("请输入密码\n");
     scanf("%s", rgu.pwd);

     MSG msg;
     msg.type = login;
     memcpy(msg.buf, &rgu, sizeof(rgu)); // 把注册结构体拷贝到消息结构体的仓库中

     // 把消息发送给服务器
     int ret = send(sID, &msg, sizeof(msg), 0);
     if (ret == -1)
     {
          printf("发送数据出错了\n");
          return -1;
     }

     ret = recv(sID, &msg, sizeof(msg), 0);
     if (msg.type == ok)
     {
          strcpy(currentLoginUserName, rgu.name); // 把用户名保存到全局变量中，其他地方都可以使用
          printf("欢迎回来，%s\n", currentLoginUserName);
          while (1)
          {
               examinefunc(sID);                                                                                                       // 每次查看是否有新消息
               printf("1.查看我的游戏账号 2.出售账号 3.查看新消息 4.查询账号 5.交流与购买 6.聊天 7.查看聊天记录 8.查看订单 9.退出\n"); // 留言
               int tt;
               while (1)
               {
                    scanf("%d", &tt);
                    if (tt == 1 || tt == 2 || tt == 3 || tt == 4 || tt == 5 || tt == 6 || tt == 7 || tt == 8 || tt == 9)
                    {
                         break;
                    }
                    else
                    {
                         printf("输入有误，请重新输入：\n");
                         while (getchar() != '\n')
                              ;
                         continue;
                    }
               }
               switch (tt)
               {
               case 1: // 查看我的账号
                    my_account_func(sID);
                    break;
               case 2: // 出售账号
                    shell_func(sID);
                    break;
               case 3: // 查看新消息
                    examinefunc_look(sID);
                    break;
               case 4: // 查询账号
                    game_chazhang(sID);
                    break;
               case 5: // 交流与购买
                    game_goumai(sID);
                    break;
               case 6: // 聊天
                    userSingleChat_c(sID);
                    break;
               case 7: // 查看聊天记录
                    examinelook_all(sID);
                    break;
               case 8: // 查看订单
                    order_func(sID);
                    break;
               case 9: // 退出账号并从登录表上移除
                    quit_all(sID);
                    return 1;
               default:
                    break;
               }
          }
          return 1;
     }
     else if (msg.type == repe)
     {
          printf("已经有用户登录\n");
          return -1;
     }

     else
     {
          printf("还没有注册或者用户名密码错误\n");
          return -1;
     }
}

int main(int count, char *arg[])
{
     struct sockaddr_in sin;
     sin.sin_family = AF_INET;   // IPV4的网络地址版本
     sin.sin_port = htons(9000); // 把9000号端口转为网络字节序并赋值给端口参数

     u_int32_t ip = 0;
     // 把字符串ip地址转为网络字节序ip
     inet_pton(AF_INET, "192.168.80.149", &ip);
     sin.sin_addr.s_addr = ip;

     // 创建一个tcp套接字，参数1指定地址族，参数2指定协议，SOCK_STREAM代表是TCP，SOCK_DGRAM代表UDP
     int sID = socket(AF_INET, SOCK_STREAM, 0);

     while (-1 == connect(sID, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)))
     {
          perror("连接服务器中...");
          sleep(1);
     }

     char buf[16];
     while (1)
     {
          printf("请选择你要的操作：1.登录 2.注册 3.退出\n");
          scanf("%s", buf);
          if (strcmp(buf, "1") == 0) // 登录
          {

               if (-1 == userLogin(sID))
               {
                    printf("登录失败了\n");
               }
          }
          else if (strcmp(buf, "2") == 0) // 注册
          {
               if (-1 == registerUser(sID))
               {
                    printf("注册失败了\n");
               }
          }
          else if (strcmp(buf, "3") == 0)
          {
               printf("退出\n");
               break;
          }
          else
          {
               printf("输入有误，请重新输入\n");
               continue;
          }
     }
     close(sID);
     return 0;
}